const express = require('express');
const path = require('path');
const morgan = require('morgan');
const helmet = require('helmet');
const cors = require('cors');
const config = require('./config');
const errorMiddleware = require('./middleware/error');
const routes = require('./routes');

/**
 * 创建并配置Express应用
 * @returns {Object} Express应用实例
 */
function createApp() {
  // 创建Express应用实例
  const app = express();

  // 配置安全中间件
  app.use(helmet());

  // 配置CORS中间件
  app.use(cors({
    origin: '*',
    methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
    allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization'],
    credentials: true
  }));

  // 配置日志中间件
  app.use(morgan(config.log.format));

  // 配置请求体解析中间件
  app.use(express.json({ limit: '10mb' }));
  app.use(express.urlencoded({ extended: true, limit: '10mb' }));

  // 配置静态文件服务
  app.use(express.static(path.join(__dirname, '..', 'public')));

  // 添加根路径响应
  app.get('/', (req, res) => {
    res.status(200).json({
      success: true,
      message: '欢迎使用Harmony Node.js服务',
      version: '1.0.0',
      docs: '/api',
      health: '/health'
    });
  });
  
  // 配置API路由
  routes.setupRoutes(app);

  // 配置错误处理中间件（必须放在最后）
  errorMiddleware.applyErrorMiddleware(app);

  // 直接在应用创建时执行数据库初始化
  async function initializeDatabase() {
    try {
      // 测试数据库连接
      const dbConnected = await config.db.testConnection();
      if (!dbConnected) {
        console.warn('警告：数据库连接失败，部分功能可能无法正常使用');
      } else {
        // 同步数据库表（开发环境可以使用force: true，但生产环境不建议）
        await config.db.syncModels(false);
        console.log('数据库表同步完成');
      }
      
      console.log('应用初始化完成，准备启动服务');
      return true;
    } catch (error) {
      console.error('应用初始化失败:', error);
      return false;
    }
  }
  
  // 导出初始化函数供server.js使用
  app.initializeDatabase = initializeDatabase;

  // 应用关闭时的清理工作
  app.on('close', () => {
    console.log('应用正在关闭...');
    // 关闭数据库连接等资源
    if (config.db.sequelize) {
      config.db.sequelize.close();
    }
  });

  return app;
}

module.exports = createApp;

// 创建默认的应用实例
const app = createApp();
module.exports.app = app;

// 默认导出应用实例
module.exports.default = app;